package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	s := "  Go-land!  "
	num := "42"
	big := "3.1415926"

	// 4.7.1  前缀/后缀
	fmt.Println(strings.HasPrefix(s, "  Go"))   // true
	fmt.Println(strings.HasSuffix(s, "and!  ")) // false

	// 4.7.2  包含关系
	fmt.Println(strings.Contains(s, "Go")) // true

	// 4.7.3  子串/字符位置
	fmt.Println(strings.Index(s, "land"))   // 4
	fmt.Println(strings.IndexAny(s, "XYZ")) // -1
	fmt.Println(strings.LastIndex(s, " "))  // 11

	// 4.7.4  替换
	fmt.Println(strings.Replace(s, "Go", "Rust", 1)) // "  Rust-land!  "

	// 4.7.5  出现次数
	fmt.Println(strings.Count(s, "l")) // 2

	// 4.7.6  重复
	fmt.Println(strings.Repeat("Na", 3)) // "NaNaNa"

	// 4.7.7  大小写
	fmt.Println(strings.ToUpper(s)) // "  GO-LAND!  "
	fmt.Println(strings.ToLower(s)) // "  go-land!  "

	// 4.7.8  修剪
	fmt.Println(strings.TrimSpace(s))             // "Go-land!"
	fmt.Println(strings.Trim(s, " !"))            // "Go-land"
	fmt.Println(strings.TrimLeft("!!!abc!", "!")) // "abc!"

	// 4.7.9  分割
	fields := strings.Fields("a bb ccc") // 按空白切
	fmt.Printf("%q\n", fields)           // ["a" "bb" "ccc"]
	parts := strings.Split("a,b,c", ",")
	fmt.Printf("%q\n", parts) // ["a" "b" "c"]

	// 4.7.10 拼接 slice → 字符串
	join := strings.Join(parts, "|")
	fmt.Println(join) // a|b|c

	// 4.7.11 从字符串里“读”—— strings.NewReader 示范
	reader := strings.NewReader("123 45.6")
	var i int
	var f float64
	fmt.Fscan(reader, &i, &f)         // 类似 fmt.Scan
	fmt.Printf("i=%d f=%.1f\n", i, f) // i=123 f=45.6

	// 4.7.12 字符串 ↔ 其它类型
	n, _ := strconv.Atoi(num)
	fmt.Printf("Atoi: %d\n", n) // 42

	f64, _ := strconv.ParseFloat(big, 64)
	fmt.Printf("ParseFloat: %.4f\n", f64) // 3.1416

	b, _ := strconv.ParseBool("true")
	fmt.Println("ParseBool:", b) // true

	// 数值 → 字符串
	fmt.Println(strconv.Itoa(2025))                     // "2025"
	fmt.Println(strconv.FormatBool(false))              // "false"
	fmt.Println(strconv.FormatFloat(2.718, 'f', 2, 64)) // "2.72"
}
